package affichage;


import gtrnadb.Database;
import gtrnadb.GeneStructure;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import stats.Stats;
import sun.awt.windows.ThemeReader;
import utilitaire.GenererExcel;

public class GenererInterface {
	
	Thread threadParser = new Thread();
	//composants d'affichage
	JFrame jFrame;
	JPanel panel;
	JPanel panelButton;
	JPanel panelLongMot;
	JButton genererFichier;
	JButton genererGraphique;
	JButton lancerTelecharger;
	JButton lancerStatistique;
	JButton ouvrirFichier;
	JLabel labelTelecharger;
	JLabel labelAccueil;
	JLabel labelAdresse;
	JLabel labelRecup;
	JPanel center;
	JLabel labelInfoFichier;
	JLabel labelAccueilDonnees;
	JLabel labelAccueilStatistique;
	JLabel labelAccueilFichier;
	JLabel labelChoixFichier;
	JLabel labelFichierSelectionne;
	JCheckBox checkPlusLongMot;
	JCheckBox checkGeneEnFonctionLong;
	JCheckBox checkProportionACGT;
	JFileChooser fichier;
	File fichierExcel;
	Boolean longMot;
	Boolean geneEnFonctionLong;
	Boolean proportionACGT;
	GenererExcel excel;
	
	public GenererInterface() {
		//initialisation des composants
		jFrame = new JFrame();
		panel = new JPanel();
		panelButton = new JPanel();
		center = new JPanel();
		panelLongMot = new JPanel();
		labelAccueil = new JLabel();
		labelAdresse = new JLabel();
		labelRecup = new JLabel();
		labelInfoFichier = new JLabel();
		labelChoixFichier = new JLabel();
		labelAccueilFichier = new JLabel();
		labelFichierSelectionne = new JLabel();
		genererFichier = new JButton();
		genererGraphique = new JButton();
		lancerStatistique = new JButton();
		labelAccueilDonnees = new JLabel();
		checkGeneEnFonctionLong = new JCheckBox();
		checkPlusLongMot = new JCheckBox();
		checkProportionACGT = new JCheckBox();
		labelAccueilStatistique = new JLabel();
		ouvrirFichier = new JButton();
		fichier = new JFileChooser();
		longMot = false;
		geneEnFonctionLong = false;
		proportionACGT = false;
		fichierExcel = null;
		excel = new GenererExcel();
		
		genererFichier.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		            genereFrameDonnee();
		        }
		    }
		);
		
		genererGraphique.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		        	genererFrameStatistiques();
		        }
		    }
		);
		
		lancerStatistique.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		            genererStatistiques();
		        }
		    }
		);
		
		checkPlusLongMot.addItemListener(
			new ItemListener() {
				
				public void itemStateChanged(ItemEvent e) {
					verifierCheckBox(e);
					
				}
			}
		);
		
		checkProportionACGT.addItemListener(
				new ItemListener() {
					
					public void itemStateChanged(ItemEvent e) {
						verifierCheckBox(e);
						
					}
				}
			);
		
		
		checkGeneEnFonctionLong.addItemListener(
				new ItemListener() {
					
					public void itemStateChanged(ItemEvent e) {
						verifierCheckBox(e);
						
					}
				}
			);
		
		ouvrirFichier.addActionListener(
			new ActionListener() {
				
				public void actionPerformed(ActionEvent e) {
					if (e.getSource() == ouvrirFichier) {
			            int returnVal = fichier.showOpenDialog(null);

			            if (returnVal == JFileChooser.APPROVE_OPTION) {
			                fichierExcel = fichier.getSelectedFile();
			                labelFichierSelectionne.setText(fichierExcel.getName());
					
			            }
					}
				}
			}
		);
		
		
		
		labelAccueil.setText("Projet bioinformatique : Statistiques des codes circulaires");
		labelAdresse.setText("Les donn�es sont r�cup�r�es de : http://gtrnadb.ucsc.edu/");
		labelAccueilDonnees.setText("R�cup�ration des donn�es");
		labelInfoFichier.setText("Le fichier cr�� est au format csv");
		labelChoixFichier.setText("Choix du fichier : ");
		genererFichier.setText("G�n�rer fichier");
		checkGeneEnFonctionLong.setText("Nombre de g�nes en fonction de leur longueur");
		checkPlusLongMot.setText("Plus long mot");
		checkProportionACGT.setText("Proportion ACGT");
		labelAccueilStatistique.setText("G�n�ration des statistiques");
		genererGraphique.setText("G�n�rer Statistiques");
		ouvrirFichier.setText("Ouvrir");
		lancerStatistique.setText("Lancer");
		
		jFrame.setLocationRelativeTo(null);
		jFrame.setResizable(false);
		jFrame.setTitle("Projet BioInfo 2011");
		jFrame.setSize(700,200);
		jFrame.setBackground(Color.WHITE);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		genererInterface();
	}
	/**
	 * Fen�tre d'accueil
	 */
	public void genererInterface() {
		
		cleanInterface();
		jFrame.setLayout(new GridLayout(2,1));
		panel = new JPanel();
		center = new JPanel();
		
		labelAccueil.setHorizontalAlignment(JLabel.CENTER);
		labelAccueilStatistique.setHorizontalAlignment(JLabel.CENTER);
		labelRecup.setHorizontalAlignment(JLabel.CENTER);
		labelAccueil.setText("Projet bioinformatique : Statistiques des codes circulaires");
		panel.add(genererFichier);
		panel.add(genererGraphique);
		jFrame.add(labelAccueil);
		jFrame.add(panel);
		jFrame.setVisible(true);
	}
	
	/**
	 * Fen�tre de r�cup des donn�es de la base
	 */
	public void genereFrameDonnee() {

		
		cleanInterface();
		
		jFrame.setLayout(new GridLayout(4,1));
		panel = new JPanel();
		center = new JPanel();
		panelButton = new JPanel();
		
		labelRecup.setText("");
		
		lancerTelecharger = new JButton();
		lancerTelecharger.setEnabled(true);
		lancerTelecharger.setText("T�l�charger");
		lancerTelecharger.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		        	
		        	labelRecup.setText("Donn�es en cours de r�cup�ration ...");
		        	lancerTelecharger.setEnabled(false);
		    		try {
			    		Database db = new Database();
			    		threadParser = new Thread(new RunImpl(db));
			    		threadParser.start();
		    		}catch(Exception ex) {
		    			labelRecup.setText("");
		    			lancerTelecharger.setEnabled(true);
		    		}
		        }
		    }
		);
		JButton buttonRetour = new JButton();
		buttonRetour.setText("Retour");
		buttonRetour.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		        	if(threadParser != null) {

		        		threadParser.interrupt();
		        		threadParser = null;
			        	
		        	}
		            genererInterface();
		        }
		    }
		);

		panel.add(labelAdresse);
		panelButton.add(lancerTelecharger);
		panelButton.add(buttonRetour);
		panelButton.add(labelRecup);
		labelAccueil.setText("R�cup�ration des donn�es");
		jFrame.add(labelAccueil);
		jFrame.add(panel);
		jFrame.add(panelButton);
		jFrame.add(labelRecup);
		jFrame.setVisible(true);
		
	}
	
	public void genererFrameStatistiques() {
		cleanInterface();
		jFrame.setLayout(new GridLayout(5,1));
		panel = new JPanel();
		center = new JPanel();
		panelButton = new JPanel();
		panelLongMot = new JPanel();
		
		longMot = false;
		geneEnFonctionLong = false;
		checkGeneEnFonctionLong.setSelected(false);
		checkPlusLongMot.setSelected(false);
		checkProportionACGT.setSelected(false);
		
		JButton buttonRetour = new JButton();
		buttonRetour.setText("Retour");
		buttonRetour.addActionListener(
		    new ActionListener() {
		        public void actionPerformed(ActionEvent e) {
		            genererInterface();
		        }
		    }
		);
		
		panel.add(labelChoixFichier);
		panel.add(ouvrirFichier);
		panelLongMot.add(labelFichierSelectionne);
		center.add(checkGeneEnFonctionLong);
		center.add(checkPlusLongMot);
		center.add(checkProportionACGT);
		panelButton.add(lancerStatistique);
		panelButton.add(buttonRetour);
		
		labelAccueil.setText("G�n�ration des statistiques");
		jFrame.add(labelAccueil);
		jFrame.add(panel);
		jFrame.add(panelLongMot);
		jFrame.add(center);
		jFrame.add(panelButton);
		jFrame.setVisible(true);		
	}
	
	
	public void verifierCheckBox(ItemEvent e) {
	    Object source = e.getItemSelectable();

	    if (source == checkGeneEnFonctionLong) {
	        geneEnFonctionLong = true;
	    } else if (source == checkPlusLongMot) {
	    	longMot = true;
	    } else if (source == checkProportionACGT) {
	    	proportionACGT=true;
	    }

	    if (e.getStateChange() == ItemEvent.DESELECTED) {
		    if (source == checkGeneEnFonctionLong) {
		        geneEnFonctionLong = false;
		    } else if (source == checkPlusLongMot) {
		    	longMot = false;
		    } else if (source == checkProportionACGT) {
		    	proportionACGT = false;
		    }
	    }

	    
	}
	
	public void genererStatistiques() {
		if(fichierExcel != null)
		{
			ArrayList<GeneStructure> listGeneStructure = new ArrayList<GeneStructure>();
			listGeneStructure = excel.readExcel(fichierExcel);
			Stats stats = new Stats(listGeneStructure);

			if(geneEnFonctionLong) {
				stats.nbGeneEnFonctionDeLongueur();
				XYSeries series = new XYSeries("nbGeneEnFonctionDeLongueur");
				for (int[] gene : stats.getNbGeneEnFonctionDeLongueur()) {
					series.add(gene[0], gene[1]);
				}
				XYDataset xyDataset = new XYSeriesCollection(series);
				JFreeChart chart = ChartFactory.createXYLineChart("nbGeneEnFonctionDeLongueur", "Longueur ARNt", "Nombre ARNt", xyDataset, PlotOrientation.VERTICAL, true, true, false);
				ChartFrame frame1=new ChartFrame("XYLine Chart",chart);
				  frame1.setVisible(true);
				  frame1.setSize(1200,800);
			}
			if (proportionACGT) {
				stats.proportionACGT();
				DefaultPieDataset union = new DefaultPieDataset();
				for (int i=0; i<stats.getProportionACGT().length; i++){
					if (i==0)
						union.setValue("A",stats.getProportionACGT()[i]*100/stats.getTotalACGT());
					else if (i==1)
						union.setValue("C",stats.getProportionACGT()[i]*100/stats.getTotalACGT());
					else if (i==2)
						union.setValue("G",stats.getProportionACGT()[i]*100/stats.getTotalACGT());
					else if (i==3)
						union.setValue("T",stats.getProportionACGT()[i]*100/stats.getTotalACGT());
				}
				JFreeChart repart = ChartFactory.createPieChart("Répartition A, C, G et T", union, true, true, false);
				ChartFrame frame1=new ChartFrame("XYLine Chart",repart);
				  frame1.setVisible(true);
				  frame1.setSize(1200,800);
			}
			if(longMot)
				
				stats.plusLongMot();
				JFrame plusLongMotFrame = new JFrame("plusLongMot");
				JPanel plusLongMotPanel = new JPanel();
				 BoxLayout    bl=new BoxLayout(plusLongMotPanel,BoxLayout.Y_AXIS);   //layoutManager
			        plusLongMotPanel.setLayout(bl);  
				plusLongMotPanel.add(new JLabel("Plus long mot :"));
				plusLongMotPanel.add(new JLabel(stats.getPlusLongMot().getSeq()));
				plusLongMotPanel.add(new JLabel());
				plusLongMotPanel.add(new JLabel("Longueur : "));
				plusLongMotPanel.add(new JLabel(stats.getPlusLongMot().getLength()));
				JScrollPane jsp = new JScrollPane(plusLongMotPanel);
				plusLongMotFrame.add(jsp);
				plusLongMotFrame.setVisible(true);
				plusLongMotFrame.setSize(1200,200);
				
		}
		else {
			System.out.println("Veuillez choisir un fichier");
		}
	}
	
	public void cleanInterface() {

		
		jFrame.remove(panel);
		jFrame.remove(panelButton);
		jFrame.remove(center);
		jFrame.remove(panelLongMot);
		//jFrame.remove(labelTelecharger);
		jFrame.remove(labelAccueil);
		jFrame.remove(labelAccueilDonnees);
		jFrame.remove(labelAccueilFichier);
		jFrame.remove(labelAccueilStatistique);
		jFrame.remove(labelAdresse);
		jFrame.remove(labelChoixFichier);
		jFrame.remove(labelRecup);
		labelInfoFichier.setText("");
		//jFrame.remove(comp)
	}
	
}